/*-
 * Copyright (C) 2018-2020, Shanghai Trusted Industry Control Platform Co., Ltd.
 * Created by 周正辉 (Zhenghui Zhou) <zhouzhenghui@ticpsh.com>, 赵楷文 (Kaiwen
 * Zhao) <zhaokaiwen@ticpsh.com>
 */

#ifndef COMMON_ATTRANALYZER_H
#define COMMON_ATTRANALYZER_H

#include <clang/AST/Decl.h>
#include <clang/AST/Type.h>
#include <clang/Basic/SourceManager.h>

#include <string>

#include "Coder.h"

namespace rocket {
namespace common {

/**
 * @brief 判定是否为待测文件原代码文件中的声明
 */
bool isLocal(const clang::Decl* decl);
bool isLocalGlobal(const clang::VarDecl* vd);

/**
 * @brief 是否为匿名变量、类型
 */
bool isAnonymous(const clang::TagDecl* decl);
bool isAnonymous(const clang::QualType& type);
bool isAnonymous(const std::string& type);

bool isCompleteType(const clang::QualType& type);
bool isDefinedType(const clang::Type* type);
bool isTypeDefinedBefore(const clang::Decl* decl, const clang::Type* type);

bool areSameType(const clang::QualType& lht, const clang::QualType& rht,
                 const clang::ASTContext& ast);

/**
 * @brief 是否声明为
 * @param decl
 * @return
 */
bool isInStd(const clang::Decl* decl);
bool isInBoost(const clang::Decl* decl);

bool isInNamespace(const std::string& name, const clang::Decl* decl);
bool isNamespace(const std::string& name, const clang::DeclContext* decl);

bool isInSystemspace(const clang::Decl* decl);

bool isRocketTestTarget(const clang::FunctionDecl* fd);

/**
 * @brief 是否是在上下文中被间接特化的声明
 */
bool isContextSpecDecl(const clang::Decl* d);

}  // namespace common
}  // namespace rocket

#endif  // ATTRANALYZER_H
